package com.IOC.beans;

import org.apache.commons.lang3.StringUtils;

/**
 * bean定义接口
 */
public interface BeanDefinition {

    String SCOPE_SINGLETON = "singleton";

    String SCOPE_PROTOTYPE = "prototype";

    /**
     * 获取bean类
     * @return 类对象
     */
    Class<?> getBeanClass();

    /**
     * 工厂方法名
     * @return 方法名
     */
    String getFactoryMethodName();

    /**
     * 工厂bean名
     * @return bean名
     */
    String getFactoryBeanName();

    /**
     * 获取作用域
     * @return 作用域名
     */
    String getScope();

    /**
     * 是否是单例作用域
     * @return 是或否
     */
    boolean isSingleton();

    /**
     * 是否是原型作用域
     * @return 是或否
     */
    boolean isPrototype();

    /**
     * 工厂初始化方法名
     * @return
     */
    String getInitMethodName();

    /**
     * 获取工厂销毁方法名
     * @return 名称
     */
    String getDestroyMethodName();

    /**
     * 当存在多个同class类型的bean实例时，当前bean实例是否是主实例（同class类型实例中默认使用该实例对象）
     * @return
     */
    boolean isPrimary();

    /**
     * 验证
     * @return 验证是否通过
     */
    default Boolean validate() {
        // 没定义class、工厂bean或工厂方法没指定，则不合法
        if(this.getBeanClass() == null) {
            if(StringUtils.isBlank(getFactoryBeanName()) || StringUtils.isBlank(getFactoryMethodName())) {
                return false;
            }
        }

        // 定义了类，又定义了工厂bean，不合法
        if(this.getBeanClass() != null && StringUtils.isNotBlank(getFactoryBeanName())) {
            return false;
        }

        return true;
    }

}
